#ifndef INSTRUCTION
#define INSTRUCTION

#include <vector>
#include <iostream>
#include <iomanip>

#include "Logger.hpp"

/**
	@brief niveau d'erreur

	niveau d'erreur sur les instructions (pour les exceptions de type Error)
*/
#define INSTRUCTION_LEVEL_ERROR			20

/**
	@brief code d'erreur

	code d'erreur en cas de typage incorrect dans une instruction
*/
#define INSTRUCTION_BAD_TYPE 			1

/**
	@brief code d'erreur

	code d'erreur en cas de valeur incorrecte dans une instruction
*/
#define INSTRUCTION_NUMERIC_ERROR        2

class Expression;

class Instruction
{
    public:
        virtual void execute () = 0;
        virtual void display ( const unsigned int shift = 0 ) const = 0;
};

class InputOutput :
    virtual public Instruction
{
    public:
        virtual void execute () =0;
        virtual void display ( const unsigned int shift = 0 ) const = 0;
    protected:
        std::vector < Expression* > _toManage;
};

#define EXECUTE(instr) { \
    if ( instr != NULL ) instr->execute (); \
}

#endif
